在Day 10有簡單介紹LED閃爍的程式,因此今天我們再加上用按鈕控制LED燈。我們用ATmega328P控制LED燈,其中接三個按鈕,分別的功能為開啟、關閉,以及以間隔1秒鐘閃爍:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
// 定義按鈕的pin腳
#define OPEN_BUTTON_PIN 2
#define CLOSE_BUTTON_PIN 3
#define FLIP_BUTTON_PIN 4
#define LED_PIN 5
int main(void) {
// 初始化端口和pin腳
DDRD = (1 << LED_PIN); // 設置LED pin腳為輸出, PORTD控制LED燈
PORTB |= (1 << OPEN_BUTTON_PIN) | (1 << CLOSE_BUTTON_PIN) | (1 << FLIP_BUTTON_PIN);
// PORTBB讀取按鈕狀態
uint8_t isLedOn = 0; //變數用於控制LED狀態
while (1) {
// 檢查按鈕狀態並執行
if (!(PINB & (1 << OPEN_BUTTON_PIN))) { // 開啟按鈕被按下
isLedOn = 1; // 打開LED
PORTD |= (1 << LED_PIN);
}
if (!(PINB & (1 << CLOSE_BUTTON_PIN))) { // 關閉按鈕被按下
isLedOn = 0; // 關閉LED
PORTD &= ~(1 << LED_PIN);
}
if (!(PINB & (1 << FLIP_BUTTON_PIN))) { // 閃爍按鈕被按下
for (int i = 0; i < 5; i++) {
PORTD ^= (1 << LED_PIN); // 切換LED狀態
_delay_ms(1000); // 延遲1秒
}
}
}
return 0;
}